/**
 * 文件名称: write_log.h
 * 摘    要: linux应用程序下记录日志头文件
 * 来    源: 参考: https://blog.csdn.net/qq_39436605/article/details/81181061
 *
 * 当前版本: 1.0 
 * 作    者: huenrong
 * 完成日期: 2019年06月20日
 **/


#ifndef __WRITE_LOG_H
#define __WRITE_LOG_H

#ifdef __cplusplus
extern "C" {
#endif

// 可修改宏定义
#define     LOG_LEVEL               3           // 控制输出日志等级
#define     WRITE_LOG_FLAG          1	    	// 写日志标志位, 1: 在日志信息中显示"文件名/函数名/代码行数"信息
#define     LOG_FILE_NAME_PREFIX    "museum_gateway"      // 日志文件名前缀
#define     LOG_FILE_MAX_LINE       10          // 日志文件最大行数
#define     ELOG_COLOR_ENABLE                   // 使能终端日志颜色

// 日志级别定义
#define     LOG_ERROR               0           // 错误
#define     LOG_WARN                1           // 警告
#define     LOG_INFO                2           // 信息
#define     LOG_DEBUG               3           // 调试

#ifdef ELOG_COLOR_ENABLE
// 终端颜色控制起始和结束符
#define     CSI_START               "\033["
#define     CSI_END                 "\033[0m"
// 输出日志字体颜色
#define     F_BLACK                 "30;"
#define     F_RED                   "31;"
#define     F_GREEN                 "32;"
#define     F_YELLOW                "33;"
#define     F_BLUE                  "34;"
#define     F_MAGENTA               "35;"
#define     F_CYAN                  "36;"
#define     F_WHITE                 "37;"
// 输出日志背景色
#define     B_NULL                  ""
#define     B_BLACK                 "40;"
#define     B_RED                   "41;"
#define     B_GREEN                 "42;"
#define     B_YELLOW                "43;"
#define     B_BLUE                  "44;"
#define     B_MAGENTA               "45;"
#define     B_CYAN                  "46;"
#define     B_WHITE                 "47;"
// 输出日志字体格式
#define     S_BOLD                  "1m"
#define     S_UNDERLINE             "4m"
#define     S_BLINK                 "5m"
#define     S_NORMAL                "22m"

#endif /* ELOG_COLOR_ENABLE */

// 函数宏定义
#define     printf_log_error(fmt, ...)          __printf_log_error(__FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define     printf_log_warn(fmt, ...)           __printf_log_warn(__FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define     printf_log_info(fmt, ...)           __printf_log_info(__FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define     printf_log_debug(fmt, ...)          __printf_log_debug(__FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define     printf_log(level, fmt, ...)         __printf_log(__FILE__, __FUNCTION__, __LINE__, level, fmt, ##__VA_ARGS__)
#define     writo_log_file(level, fmt, ...)     __write_log_file(__FILE__, __FUNCTION__, __LINE__, level, fmt, ##__VA_ARGS__)

/************************************************************************
函数名称: __printf_log_error
函数功能: 打印错误日志(打印代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log_error(const char *file_name, const char *function_name, 
                        const unsigned int code_line, const char *fmt, ...);

/************************************************************************
函数名称: __printf_log_warn
函数功能: 打印警告日志(打印代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log_warn(const char *file_name, const char *function_name, 
                        const unsigned int code_line, const char *fmt, ...);

/************************************************************************
函数名称: __printf_log_info
函数功能: 打印信息日志(打印代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log_info(const char *file_name, const char *function_name, 
                        const unsigned int code_line, const char *fmt, ...);

/************************************************************************
函数名称: __printf_log_debug
函数功能: 打印调试日志(打印代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log_debug(const char *file_name, const char *function_name, 
                        const unsigned int code_line, const char *fmt, ...);

/************************************************************************
函数名称: __printf_log
函数功能: 打印日志(打印代码文件名、函数名、代码所在行)
函数参数: log_level: 需要打印的日志等级
          file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log(const char *file_name, const char *function_name,  const unsigned int code_line, 
                    const unsigned char log_level, const char *fmt, ...);

/************************************************************************
函数名称: __write_log_file
函数功能: 将内容写到日志文件中(记录代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          log_level: 日志等级
          fmt: 要写入内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __write_log_file(const char *file_name, const char *function_name, const unsigned int code_line, 
                    const unsigned char log_level, const char *fmt, ...);


#ifdef __cplusplus
}
#endif

#endif /* __WRITE_LOG_H */

